home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / MNetsrc.hqx / Mac TCP_IP Source v.33 / nrsubr.c < prev    next >
Text File  |  1989-01-23  |  3KB  |  150 lines

  1. /* Functions for level 3 net/rom support.
  2.  * Copyright 1989 by Daniel M. Frank, W9NK.  Permission granted for
  3.  * non-commercial distribution only.
  4.  */
  5.  
  6. #include "global.h"
  7. #include "mbuf.h"
  8. #include "timer.h"
  9. #include "ax25.h"
  10. #include "netrom.h"
  11. #include "lapb.h"
  12. #include <ctype.h>
  13.  
  14. /* Convert a net/rom network header to host format structure
  15.  * Return -1 if error, 0 if OK
  16.  */
  17.  
  18. int
  19. ntohnr3(hdr,bpp)
  20. register struct nr3hdr *hdr ;    /* output structure */
  21. struct mbuf **bpp ;
  22. {
  23.     register struct ax25_addr *axp ;
  24.     char buf[AXALEN] ;
  25.     char *getaxaddr() ;
  26.  
  27.     if (pullup(bpp,buf,AXALEN) < AXALEN)
  28.         return -1 ;
  29.     getaxaddr(&hdr->source,buf) ;
  30.  
  31.     if (pullup(bpp,buf,AXALEN) < AXALEN)
  32.         return -1 ;
  33.     getaxaddr(&hdr->dest,buf) ;
  34.  
  35.     if (pullup(bpp,&hdr->ttl,1) != 1)
  36.         return -1 ;
  37.  
  38.     return 0 ;
  39. }
  40.  
  41. /* Convert a host-format net/rom level 3 header into an mbuf ready
  42.  * for transmission.
  43.  */
  44.  
  45. struct mbuf *
  46. htonnr3(hdr)
  47. register struct nr3hdr *hdr;
  48. {
  49.     struct mbuf *rbuf ;
  50.     register char *cp ;
  51.     char *putaxaddr();
  52.  
  53.     if (hdr == (struct nr3hdr *) NULL)
  54.         return NULLBUF ;
  55.  
  56.     /* Allocate space for return buffer */
  57.     if ((rbuf = alloc_mbuf(NR3HLEN)) == NULLBUF)
  58.         return NULLBUF ;
  59.  
  60.     rbuf->cnt = NR3HLEN ;
  61.  
  62.     /* Now convert */
  63.     cp = rbuf->data ;
  64.  
  65.     hdr->source.ssid &= ~E ;    /* source E-bit is always off */
  66.     hdr->dest.ssid |= E ;        /* destination E-bit always set */
  67.  
  68.     cp = putaxaddr(cp,&hdr->source) ;
  69.     cp = putaxaddr(cp,&hdr->dest) ;
  70.     *cp = hdr->ttl ;
  71.  
  72.     return rbuf ;
  73. }
  74.  
  75. /* Convert a net/rom routing broadcast destination subpacket from
  76.  * network format to a host format structure.  Return -1 if error,
  77.  * 0 if OK.
  78.  */
  79. int ntohnrdest(ds,bpp)
  80. register struct nr3dest *ds ;
  81. struct mbuf **bpp ;
  82. {
  83.     char buf[AXALEN] ;
  84.     char quality ;
  85.  
  86.     /* get destination callsign */
  87.     if (pullup(bpp,buf,AXALEN) < AXALEN)
  88.         return -1 ;
  89.     memcpy(ds->dest.call,buf,ALEN) ;
  90.     ds->dest.ssid = buf[ALEN] ;
  91.  
  92.     /* get destination alias */
  93.     if (pullup(bpp,ds->alias,ALEN) < ALEN)
  94.         return -1 ;
  95.     ds->alias[ALEN] = '\0' ;
  96.  
  97.     /* get best neighbor callsign */
  98.     if (pullup(bpp,buf,AXALEN) < AXALEN)
  99.         return -1 ;
  100.     memcpy(ds->neighbor.call,buf,ALEN) ;
  101.     ds->neighbor.ssid = buf[ALEN] ;
  102.  
  103.     /* get route quality */
  104.     if (pullup(bpp,&quality,1) < 1)
  105.         return -1 ;
  106.     ds->quality = uchar(quality) ;
  107.  
  108.     return 0 ;
  109. }
  110.  
  111. /* Convert a host-format net/rom destination subpacket into an
  112.  * mbuf ready for transmission as part of a route broadcast
  113.  * packet.
  114.  */
  115. struct mbuf *
  116. htonnrdest(ds)
  117. register struct nr3dest *ds ;
  118. {
  119.     struct mbuf *rbuf ;
  120.     register char *cp ;
  121.  
  122.     if (ds == (struct nr3dest *) NULL)
  123.         return NULLBUF ;
  124.  
  125.     /* Allocate space for return buffer */
  126.     if ((rbuf = alloc_mbuf(NRRTDESTLEN)) == NULLBUF)
  127.         return NULLBUF ;
  128.  
  129.     rbuf->cnt = NRRTDESTLEN ;
  130.  
  131.     cp = rbuf->data ;
  132.  
  133.     memcpy(cp,ds->dest.call,ALEN) ;
  134.     cp += ALEN ;
  135.     *cp++ = ds->dest.ssid ;
  136.  
  137.     memcpy(cp,ds->alias,ALEN) ;
  138.     cp += ALEN ;
  139.  
  140.     memcpy(cp,ds->neighbor.call,ALEN) ;
  141.     cp += ALEN ;
  142.     *cp++ = ds->neighbor.ssid ;
  143.  
  144.     *cp = uchar(ds->quality) ;
  145.  
  146.     return rbuf ;
  147. }
  148.  
  149.  
  150.